package com.zhuqi.redis.string;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.types.RedisClientInfo;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @author : ZhuQi
 * @version : 时间:2022/1/6 17:11 版本:
 * redis String类型测试
 * 问题1: 当第一次设置key给了过期时间，在它没有过期的时候更新他(不设置过期时间),这个时候过期时间就没有了，这个key就是永不过期。
 *
 */
@Component
@Slf4j
public class StringRedisService {

    @Autowired
    private StringRedisTemplate redisTemplate;




    /**
     * 测试内容: String 数据类型简单的使用
     */
    public void testStringRedis() throws Exception {

        // 设置值
        redisTemplate.opsForValue().set("zqtest", "value");

        // 获取值
        log.info(redisTemplate.opsForValue().get("zqtest"));

        // 删除值
        redisTemplate.delete("zqtest");

        // 设置值并设置过期时间
        redisTemplate.opsForValue().set("zq", "1", 10L, TimeUnit.SECONDS);

        // 拿到key的过期时间
        log.info(redisTemplate.getExpire("zq").toString());

        // 给key重新设置过期时间
        redisTemplate.expire("zq", 60L, TimeUnit.SECONDS);

        // 随机获取一个key
        String s = redisTemplate.randomKey();
        log.info("s");

        // 修改key的名字
        redisTemplate.rename("oldKey", "newKey");

        // 修改key的名字。存在就修改，返回true 失败就不修改返回false
        Boolean aBoolean = redisTemplate.renameIfAbsent("oldKey", "newKey");
    }

    /**
     *  根据规则拿到所有KEY "*" 拿到所有  "UV*"拿到以UV开头后面模糊的key
     */
    public void redisOtherExec1() {
        Set<String> keys = redisTemplate.keys("UV*");
        keys.forEach(System.out::println);
    }

    /**
     * 测试 setIfAbsent（）方法，该方法只有在没有这个key的时间才会设置值，成功返回 true 失败返回false
     */
    public void redisOtherExec2() {
        if (redisTemplate.opsForValue().setIfAbsent("zq", "value")) {
            log.info("成功设置值");

            if (redisTemplate.opsForValue().setIfAbsent("zq", "value")) {
                log.info("成功设置值");
            } else {
                log.info("设置值失败");
            }
        }
    }

    /**
     * 测试 计算 redis 中某种 key 的数量
     */
    public void redisOtherExec3() {
        ArrayList<String> list = new ArrayList<>();
        list.add("PVINDEXPAGE:2021");
        Long aLong = redisTemplate.countExistingKeys(list);
        log.info(aLong.toString());
    }

    /**
     * 测试 获取key的类型
     */
    public void redisOtherExec4() {
        DataType type = redisTemplate.type("PVINDEXPAGE:2021");
        log.info(type.toString());
    }

    /**
     * 测试 请求有关已连接客户端的信息和统计信息。
     */
    public void redisOtherExec5() {
        List<RedisClientInfo> clientList = redisTemplate.getClientList();
        clientList.forEach(System.out::println);
        log.info("链接数:{}", clientList.size());
    }

    /**
     * 测试
     */
    public void redisOtherExec6() {

    }
}
